package com.xwli.javase.example;

/**
 * @program: springcloud
 * @description:
 * @author: xwli
 * @create: 2022-03-12 17:22
 **/
public class JoinExample {

    private class A extends Thread {
        @Override
        public void run() {
            System.out.println("A");
        }
    }

    private class B extends Thread {

        private A a;

        B(A a) {
            this.a = a;
        }

        /**
        * @description:
         * 在线程中调用另一个线程的 join() 方法，
         * 会将当前线程挂起，而不是忙等待，直到目标线程结束。
        * @params: []
        * @return: void
        * @author: xwli
        * @date: 2022/3/12 17:23
        */
        @Override
        public void run() {
            try {
                a.join(); //挂起b线程，直到a线程结束
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("B");
        }
    }

    /**
    * @description:
     * 对于以下代码，虽然 b 线程先启动，但是因为在 b 线程中调用了 a 线程的 join() 方法，
     * b 线程会等待 a 线程结束才继续执行，因此最后能够保证 a 线程的输出先于 b 线程的输出。
    * @params: []
    * @return: void
    * @author: xwli
    * @date: 2022/3/12 17:24
    */
    public void test() {
        A a = new A();
        B b = new B(a);
        b.start();
        a.start();
    }

    public static void main(String[] args) {
        JoinExample example = new JoinExample();
        example.test();
    }
}
